#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

char* const env[] = {(char* const)"MYENV=666", (char* const)"HELLO=helloworld", NULL};
extern char** environ;
int main(){
  /*execl使用*/
 // execl("/usr/bin/ls", "ls", "-a", "-l", "-n", NULL);

  /*execv使用*/
 // char* const arg[] = {(char* const)"ls", (char* const)"-a", (char* const)"-l", (char* const)"-n"};
 // execv("/usr/bin/ls", arg);
 
  /*execlp使用*/
 //execlp("ls", "ls", "-a", "-l", "-n", NULL);

  /*execvp使用*/
 //char* const arg[] = {(char* const)"ls", (char* const)"-a", (char* const)"-l", (char* const)"-n"};
 //execvp("ls", arg);
 
  /*execvpe的使用 模拟bash进程传环境变量表给main函数*/
  int id = fork();
  if(id < 0){
    perror("fork");
    return 1;
  }
  else if(id == 0){
    char* const arg[] = {(char* const)"OTHER", (char* const)"-a", (char* const)"-b", NULL};
    printf("子进程pid : %d\n", getpid());
    printf("进程开始替换\n");

    /*演示如何追加环境变量 法1*/
    putenv((char* const)"MY=123");
    putenv((char* const)"HH=123456789");
    execvpe("./OTHER", arg, environ);
    /*法2 就是直接用当前的全局环境变量表，导入到一个新的数组内，然后再自行添加环境变量 这里就不写了*/

    //execvpe("./OTHER", arg, env);
    //execv("./OTHER", arg);
  }
  else{
    printf("父进程，pid : %d\n", getpid());
    int rid = wait(NULL);
    if(rid == id){
      printf("等待子进程成功，pid为%d\n", rid);
    }
    else{
      printf("子进程等待失败\n");
    }
  }
  


  return 0; 
}








/*测试进程替换前后的pid*/
//int main(){
//  int id = fork();
//  if(id < 0){
//    perror("fork");
//    return 1;
//  }
//  else if(id == 0){
//    printf("子进程，pid是%d, ppid是%d\n", getpid(), getppid());
//    printf("子进程替换\n");
//    execl("/usr/bin/ls", "ls", "-a", "-l", "-n", NULL);
//  }
//  else{
//    printf("父进程先休眠3s\n");
//    sleep(3);
//    printf("开始回收子进程\n");
//    int rid = waitpid(id, NULL, 0);
//    if(rid == id){
//      printf("回收子进程成功，pid为%d\n", rid);
//    }
//    else{
//      printf("回收子进程失败\n");
//    }
//  }
//  return 0;
//}




/*展示进程替换*/
//int main(){
//  printf("本进程开始\n");
//  printf("HelloWorld\n");
//  execl("/usr/bin/ls", "ls", "-a", "-l", "-n", NULL);
//  printf("进程结束\n");
//  return 0;
//}
